package com.example.exception;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * 异常处理示例
 * 对比C#的异常处理
 */
public class ExceptionExamples {
    
    public static void main(String[] args) {
        ExceptionExamples examples = new ExceptionExamples();
        
        System.out.println("=== Java异常处理示例 ===");
        
        // 基本异常处理
        examples.basicExceptionHandling();
        
        // 自定义异常
        examples.customExceptionExample();
        
        // 多重异常处理
        examples.multipleExceptionHandling();
        
        // 资源管理 (try-with-resources)
        examples.resourceManagement();
    }
    
    /**
     * 基本异常处理示例
     * 对比C#的try-catch-finally
     */
    public void basicExceptionHandling() {
        System.out.println("\n--- 基本异常处理示例 ---");
        
        try {
            // 可能抛出异常的代码
            int result = divide(10, 0);
            System.out.println("结果: " + result);
        } catch (ArithmeticException ex) {
            // 处理特定异常 (类似C#的catch(DivideByZeroException ex))
            System.out.println("除零错误: " + ex.getMessage());
        } catch (Exception ex) {
            // 处理其他异常 (类似C#的catch(Exception ex))
            System.out.println("其他错误: " + ex.getMessage());
        } finally {
            // 总是执行的代码 (类似C#的finally)
            System.out.println("finally块总是执行");
        }
    }
    
    /**
     * 除法方法 - 可能抛出异常
     */
    public int divide(int a, int b) {
        if (b == 0) {
            throw new ArithmeticException("除数不能为零");
        }
        return a / b;
    }
    
    /**
     * 自定义异常示例
     */
    public void customExceptionExample() {
        System.out.println("\n--- 自定义异常示例 ---");
        
        try {
            validateAge(-5);
        } catch (InvalidAgeException ex) {
            System.out.println("年龄验证失败: " + ex.getMessage());
            System.out.println("无效年龄: " + ex.getInvalidAge());
        }
        
        try {
            validateAge(25);
            System.out.println("年龄验证成功");
        } catch (InvalidAgeException ex) {
            System.out.println("年龄验证失败: " + ex.getMessage());
        }
    }
    
    /**
     * 年龄验证方法
     */
    public void validateAge(int age) throws InvalidAgeException {
        if (age < 0 || age > 150) {
            throw new InvalidAgeException("年龄必须在0-150之间", age);
        }
    }
    
    /**
     * 多重异常处理示例
     */
    public void multipleExceptionHandling() {
        System.out.println("\n--- 多重异常处理示例 ---");
        
        try {
            // 可能抛出多种异常的代码
            processData("test.txt");
        } catch (IOException ex) {
            System.out.println("IO错误: " + ex.getMessage());
        } catch (IllegalArgumentException ex) {
            System.out.println("参数错误: " + ex.getMessage());
        } catch (Exception ex) {
            System.out.println("未知错误: " + ex.getMessage());
        }
        
        // Java 7+ 多重异常捕获 (类似C#的catch(Exception1 | Exception2 ex))
        try {
            processData("test.txt");
        } catch (IOException | IllegalArgumentException ex) {
            System.out.println("IO或参数错误: " + ex.getMessage());
        }
    }
    
    /**
     * 处理数据的方法
     */
    public void processData(String filename) throws IOException, IllegalArgumentException {
        if (filename == null || filename.trim().isEmpty()) {
            throw new IllegalArgumentException("文件名不能为空");
        }
        
        File file = new File(filename);
        if (!file.exists()) {
            throw new IOException("文件不存在: " + filename);
        }
        
        // 模拟文件处理
        System.out.println("处理文件: " + filename);
    }
    
    /**
     * 资源管理示例 (try-with-resources)
     * 对比C#的using语句
     */
    public void resourceManagement() {
        System.out.println("\n--- 资源管理示例 ---");
        
        // 传统方式 (需要手动关闭资源)
        FileReader reader = null;
        try {
            reader = new FileReader("test.txt");
            // 读取文件内容
            System.out.println("使用传统方式读取文件");
        } catch (IOException ex) {
            System.out.println("读取文件错误: " + ex.getMessage());
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException ex) {
                    System.out.println("关闭文件错误: " + ex.getMessage());
                }
            }
        }
        
        // 现代方式 (try-with-resources，自动关闭资源)
        try (FileReader autoReader = new FileReader("test.txt")) {
            // 读取文件内容
            System.out.println("使用try-with-resources读取文件");
        } catch (IOException ex) {
            System.out.println("读取文件错误: " + ex.getMessage());
        }
        // 资源会自动关闭，无需手动处理
    }
    
    /**
     * 异常传播示例
     */
    public void exceptionPropagation() {
        System.out.println("\n--- 异常传播示例 ---");
        
        try {
            methodA();
        } catch (Exception ex) {
            System.out.println("捕获到异常: " + ex.getMessage());
            // 打印异常堆栈
            ex.printStackTrace();
        }
    }
    
    public void methodA() throws Exception {
        try {
            methodB();
        } catch (Exception ex) {
            System.out.println("methodA捕获异常，重新抛出");
            throw ex; // 重新抛出异常
        }
    }
    
    public void methodB() throws Exception {
        throw new Exception("这是来自methodB的异常");
    }
}

/**
 * 自定义异常类
 * 对比C#的自定义异常
 */
class InvalidAgeException extends Exception {
    private int invalidAge;
    
    public InvalidAgeException(String message, int invalidAge) {
        super(message);
        this.invalidAge = invalidAge;
    }
    
    public int getInvalidAge() {
        return invalidAge;
    }
} 